跳到主要内容

结构模式-桥接模式

什么是桥接模式?

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。(合成\聚合 复用原则)

这里 UML 图的 Abstraction 和 Implementor 应该是水平的,但是这个 mermaid 作的图好像无法设置为水平(下面 “手机品牌” 和 “手机软件” 同理)...

classDiagram Abstraction <|-- RefinedAbstraction Abstraction o--> Implementor Implementor <|-- ConcreteImplementorA Implementor <|-- ConcreteImplementorB Abstraction: +operation() RefinedAbstraction: +operation() Implementor: +operationImp() ConcreteImplementorA: +operationImp() ConcreteImplementorB: +operationImp()

就是在 Abstraction 与 Implementor 之间架设一座桥(聚合线),其中 Abstraction 为抽象化角色(不一定要特地抽象出一个类,可以直接一个类解决)它定义出该角色的行为,同时保存对实现类(Implementor)的引用

如果上面的类图不太好懂,下面举个书上原本的例子,就比较明白了

先使用类结构型模式的方式编写一个 手机-软件 的 UML 图

classDiagram 手机品牌 <|-- 手机品牌A 手机品牌 <|-- 手机品牌B 手机品牌A <|-- 手机品牌A的通讯录 手机品牌A <|-- 手机品牌A的游戏 手机品牌B <|-- 手机品牌B的通讯录 手机品牌B <|-- 手机品牌B的游戏

如上所示,软件供应商需要为每个手机品牌都创建一套它们的专属的软件,而如下采用了桥接的方式,软件供应商只需去实现这个 “手机软件” 接口,就能给所有品牌的手机使用

classDiagram 手机品牌 <|-- 手机品牌A 手机品牌 <|-- 手机品牌B 手机品牌 o-- 手机软件 手机软件 <|-- 通讯录 手机软件 <|-- 游戏

对于有两个独立变化的维度,且这两个维度都需要进行扩展的情况下(例如这里的 “手机品牌” 和 “手机软件” 都有可能会变化),桥接的方式优于继承的方式

实例

说白了就是内嵌一个对象进来